package com.zenithmind.task.pojo.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.zenithmind.common.base.BaseEntity;
import lombok.Data;

import java.util.Objects;

/**
 * 任务分类实体类
 * 遵循面向对象设计原则：
 * 1. 单一职责原则：专注于分类信息管理
 * 2. 封装原则：提供分类层级和权限相关的业务方法
 * 3. 数据完整性：确保分类层级关系的一致性
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@TableName("task_category")
public class TaskCategory extends BaseEntity {

    /**
     * 分类ID
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 分类名称
     */
    @TableField("name")
    private String name;

    /**
     * 分类描述
     */
    @TableField("description")
    private String description;

    /**
     * 分类图标
     */
    @TableField("icon")
    private String icon;

    /**
     * 分类颜色
     */
    @TableField("color")
    private String color;

    /**
     * 父分类ID
     */
    @TableField("parent_id")
    private String parentId;

    /**
     * 分类层级
     */
    @TableField("level")
    private Integer level;

    /**
     * 分类路径
     */
    @TableField("path")
    private String path;

    /**
     * 排序权重
     */
    @TableField("sort_order")
    private Integer sortOrder;

    /**
     * 创建者ID
     */
    @TableField("creator_id")
    private String creatorId;

    /**
     * 创建者名称
     */
    @TableField("creator_name")
    private String creatorName;

    /**
     * 是否系统分类
     */
    @TableField("is_system")
    private Integer isSystem;

    /**
     * 是否公开
     */
    @TableField("is_public")
    private Integer isPublic;

    /**
     * 状态：0-禁用，1-启用
     */
    @TableField("status")
    private Integer status;

    /**
     * 任务数量
     */
    @TableField("task_count")
    private Integer taskCount;

    /**
     * 备注
     */
    @TableField("remark")
    private String remark;

    /**
     * 是否删除：0-删除，1-正常
     */
    @TableField("is_deleted")
    @TableLogic
    private Integer isDeleted;

    // ==================== 业务方法 ====================

    /**
     * 检查是否为根分类
     *
     * @return 是否为根分类
     */
    public boolean isRootCategory() {
        return parentId == null || parentId.trim().isEmpty();
    }

    /**
     * 检查是否为子分类
     *
     * @return 是否为子分类
     */
    public boolean isSubCategory() {
        return !isRootCategory();
    }

    /**
     * 检查是否为系统分类
     *
     * @return 是否为系统分类
     */
    public boolean isSystemCategory() {
        return isSystem != null && isSystem == 1;
    }

    /**
     * 检查是否为公开分类
     *
     * @return 是否为公开分类
     */
    public boolean isPublicCategory() {
        return isPublic != null && isPublic == 1;
    }

    /**
     * 检查分类状态是否启用
     *
     * @return 状态是否启用
     */
    public boolean isEnabled() {
        return status != null && status == 1;
    }

    /**
     * 检查分类状态是否禁用
     *
     * @return 状态是否禁用
     */
    public boolean isDisabled() {
        return status != null && status == 0;
    }

    /**
     * 检查是否有任务
     *
     * @return 是否有任务
     */
    public boolean hasTasks() {
        return taskCount != null && taskCount > 0;
    }

    /**
     * 生成分类路径
     *
     * @param parentPath 父分类路径
     * @return 分类路径
     */
    public String generatePath(String parentPath) {
        if (parentPath == null || parentPath.trim().isEmpty()) {
            return "/" + id;
        }
        return parentPath + "/" + id;
    }

    /**
     * 检查分类数据有效性
     *
     * @return 是否有效
     */
    public boolean isValid() {
        return name != null && !name.trim().isEmpty() &&
               level != null && level >= 0 &&
               sortOrder != null && sortOrder >= 0;
    }

    /**
     * 获取分类层级描述
     *
     * @return 层级描述
     */
    public String getLevelDescription() {
        if (level == null) {
            return "未知层级";
        }
        switch (level) {
            case 0: return "根分类";
            case 1: return "一级分类";
            case 2: return "二级分类";
            case 3: return "三级分类";
            default: return level + "级分类";
        }
    }

    /**
     * 检查是否可以删除
     *
     * @return 是否可以删除
     */
    public boolean canDelete() {
        return !isSystemCategory() && !hasTasks();
    }

    /**
     * 检查是否可以编辑
     *
     * @return 是否可以编辑
     */
    public boolean canEdit() {
        return !isSystemCategory() || isPublicCategory();
    }

    /**
     * 重写 equals 方法
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        if (!super.equals(obj)) return false;

        TaskCategory that = (TaskCategory) obj;
        return Objects.equals(id, that.id);
    }

    /**
     * 重写 hashCode 方法
     */
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), id);
    }
}
